#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
#include<sys/wait.h>
#include<stdlib.h>
#define BUFFER_SIZE 50
int main()
{
    const char *pathname = "myfifo";
    mode_t mode = 0666; // 设置权限为读写所有者、组和其他用户
    if (mkfifo(pathname, mode) == -1)
    {
        perror("mkfifo");
        return 1;
    }
    printf("命名管道创建成功：%s\n", pathname);
    // 打开源文件和目标文件    
    int source_fd = open("./text.txt", O_RDONLY);
    if (source_fd == -1) {
        perror("open source file");
        return 1;
    }

    int destination_fd = open("./popytext.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (destination_fd == -1) {
        perror("open destination file");
        return 1;
    }
    // 打开命名管道
    int fifo_fd = open("myfifo", O_RDWR);
    if (fifo_fd == -1) {
        perror("open fifo");
        return 1;
    }
    
    // 创建子进程进行数据传输
    pid_t pid = fork();
    if (pid == -1) {
        perror("fork");
        return 1;
    }
    char buffer[BUFFER_SIZE];
    ssize_t bytes_read;
    if (pid == 0) 
    {
        // 子进程从命名管道中读取数据并写入目标文件
        if((bytes_read = read(fifo_fd, buffer, BUFFER_SIZE)) > 0) {
            write(destination_fd, buffer, bytes_read);
        }
        exit(EXIT_SUCCESS);
    }
    // 父进程从源文件中读取数据并写入命名管道
    if((bytes_read = read(source_fd, buffer, BUFFER_SIZE)) > 0) {
        write(fifo_fd, buffer, bytes_read);
    }
    close(source_fd);
    close(fifo_fd);
    close(destination_fd);
    // 等待子进程结束
    wait(NULL);
    // 删除命名管道
    unlink("myfifo");

    return 0;
}